package com.atguigu.yygh.cos.util;

import com.qcloud.cos.COSClient;
import com.qcloud.cos.ClientConfig;
import com.qcloud.cos.auth.BasicCOSCredentials;
import com.qcloud.cos.auth.COSCredentials;
import com.qcloud.cos.http.HttpProtocol;
import com.qcloud.cos.model.PutObjectRequest;
import com.qcloud.cos.model.PutObjectResult;
import com.qcloud.cos.region.Region;
import lombok.Data;
import org.joda.time.DateTime;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component;
import java.io.File;
import java.util.UUID;


@Component
@PropertySource("classpath:cos.properties")
@ConfigurationProperties(prefix = "cos",ignoreInvalidFields =false)
@Data
public class CosServiceUtil {

    private String secretId;
    private String secretKey;

    private String regionName;

    private String bucketName;

    private String baseResultUrl;


    /**
     * 创建 COS 客户端
     */
    public COSClient getCosClient(){
        // 1 初始化用户身份信息（secretId, secretKey）。
        COSCredentials cred = new BasicCOSCredentials(secretId, secretKey);     // [Credentials]

        // 2 设置 bucket 的地域, COS 地域的简称请参照 https://cloud.tencent.com/document/product/436/6224
        // clientConfig 中包含了设置 region, https(默认 http), 超时, 代理等 set 方法, 使用可参见源码或者常见问题 Java SDK 部分。
        Region region = new Region(regionName);
        ClientConfig clientConfig = new ClientConfig(region);
        // 这里建议设置使用 https 协议
        clientConfig.setHttpProtocol(HttpProtocol.https);
        // 3 生成 cos 客户端。
        COSClient cosClient = new COSClient(cred, clientConfig);
        return cosClient;
    }

    /**
     * 上传文件
     *  官方Demo存在的问题：
     *      1、如果上传同名的不同文件，则后上传的文件会覆盖Cos中已存在的文件。
     *          解决方案：使用 UUID 生成唯一的随机值添加到文件名中
     *      2、优化：每天自动创建一个以日期命名的文件夹，将当天的文件放在对应文件夹下
     *
     * @param cosClient cos客户端对象
     * @param file  上传的文件对象
     * @return
     */
    public String uploadFile(COSClient cosClient, File file){
        // 指定要上传的文件（从当前方法的参数中获取）

        // 指定文件要存放的存储桶（从当前类的属性中读取）

        // 指定文件上传到 COS 上的路径，即对象键。例如对象键为folder/picture.jpg，则表示将文件 picture.jpg 上传到 folder 路径下
        /* 设置目录（文件夹）名称。 目录按每天的日期命名 */
        String folder = new DateTime().toString("yyyy/MM/dd");
        /* 设置文件名称。  使用UUID生成随机的唯一值，添加到文件名称中。*/
        String uuid = UUID.randomUUID().toString().replaceAll("-", "");
        String fileName = uuid + file.getName();
        /* 指定路径名（目录+文件名） */
        String key = folder + "/" + fileName;
        PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, key, file);
        PutObjectResult putObjectResult = cosClient.putObject(putObjectRequest);
        System.out.println(putObjectRequest);

        // 返回文件的访问 URL
        String results = baseResultUrl + key;
        // 关闭客户端(关闭后台线程)
        cosClient.shutdown();

        return results;
    }

}
